package cn.biplam.common.bean.md;

import java.util.ArrayList;

import cn.biplam.common.bean.Bean;
import cn.biplam.common.client.OperatorResult;
import cn.biplam.common.paramters.MdParam.Index_Node_Move_Type;
import cn.biplam.common.wrapper.ErrorMessage;

/**
 *  索引表操作访问接口
 * @author XiaoRuxing Oct 14, 20093:43:27 PM
 * @version 1.0
 */
public abstract class IndexTable extends Bean{

	/**
	 *  更新索引表
	 *  @param nodeId    索引Id
	 *  @param nodeName  索引名称
	 * @throws ErrorMessage
	 */
	public abstract boolean update(String nodeId,String nodeName) throws ErrorMessage;
	
	/**
	 *  获取更新索引表的SQL语句
	 *  @param nodeId    索引Id
	 *  @param nodeName  索引名称
	 * @throws ErrorMessage
	 */
	public abstract ArrayList<String> getUpdateSql(String nodeId,
			String nodeName) throws ErrorMessage;
	
	/**
	 *  更新索引表
	 *  @param nodeId    索引Id
	 *  @param nodeCode  节点代码
	 * @throws ErrorMessage
	 */
	public abstract boolean updateCode(String nodeId,String nodeCode) throws ErrorMessage;
	
	/**
	 *  获取更新索引表的SQL语句
	 *  @param nodeId    索引Id
	 *  @param nodeCode  节点代码
	 * @throws ErrorMessage
	 */
	public abstract ArrayList<String> getUpdateSqlCode(String nodeId,
			String nodeCode) throws ErrorMessage;

	/**
	 *  传入索引ID,插入记录到索引表
	 * @param nodeID      索引ID
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insertNode(String nodeID,String parentId,String nodeName,
			String operatorType) throws ErrorMessage;
	
	/**
	 *  传入索引ID,插入记录到索引表
	 * @param nodeID      索引ID
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     真实表节点ID
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insertNode(String nodeID,String parentId,String nodeName,
			String nodeCode,
			String operatorType) throws ErrorMessage;
	
	/**
	 *  传入索引ID,插入记录到索引表
	 * @param nodeID      索引ID
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     真实表节点ID
	 * @param operatorType 节点操作类型
	 * @param nodeDesc     节点描述
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insertNode(String nodeID,String parentId,String nodeName,
			String nodeCode,
			String operatorType,
			String nodeDesc) throws ErrorMessage;
	
	/**
	 *  传入索引ID,获取插入记录到索引表的SQL
	 * @param nodeID      索引ID
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertNodeSql(String nodeID,String parentId,String nodeName,
			String operatorType) throws ErrorMessage;
	
	/**
	 *  传入索引ID,获取插入记录到索引表的SQL
	 * @param nodeID      索引ID
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     真实表节点ID
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertNodeSql(String nodeID,String parentId,String nodeName,
			String nodeCode,
			String operatorType) throws ErrorMessage;
	
	/**
	 *  传入索引ID,获取插入记录到索引表的SQL
	 * @param nodeID      索引ID
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     真实表节点ID
	 * @param operatorType 节点操作类型
	 * @param nodeDesc     节点描述
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertNodeSql(String nodeID,String parentId,String nodeName,
			String nodeCode,
			String operatorType,
			String nodeDesc) throws ErrorMessage;
	
	/**
	 *  插入记录到索引表
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insert(String parentId,String nodeName,
			String operatorType) throws ErrorMessage;
	
	/**
	 *  插入记录到索引表
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     节点代码ID
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insert(String parentId,String nodeName,
			String nodeCode,String operatorType) throws ErrorMessage;
	
	/**
	 *  插入记录到索引表
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     节点代码ID
	 * @param operatorType 节点操作类型
	 * @param nodeDesc     节点描述
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insert(String parentId,String nodeName,
			String nodeCode,String operatorType, String nodeDesc) throws ErrorMessage;
	
	/**
	 *  获取插入记录到索引表的SQL语句
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID  
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertSql(String parentId,String nodeName,
			String operatorType) throws ErrorMessage;
	
	/**
	 *  获取插入记录到索引表的SQL语句
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     节点代码ID
	 * @param operatorType 节点操作类型
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertSql(String parentId,String nodeName,
			String nodeCode,String operatorType) throws ErrorMessage;
	
	/**
	 *  获取插入记录到索引表的SQL语句
	 * @param parentId     父节点ID
	 * @param nodeName     节点名称
	 * @param nodeCode     节点代码ID
	 * @param operatorType 节点操作类型
	 * @param nodeDesc     节点描述
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertSql(String parentId,String nodeName,
			String nodeCode,String operatorType, String nodeDesc) throws ErrorMessage;
	
	/**
	 *  插入根节点到索引表,默认父虚拟根节点为-1
	 * @param nodeName      节点名称
	 * @param nodeCode      节点代码ID
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insertRoot(String nodeName,
			String nodeCode) throws ErrorMessage;
	
	/**
	 *  插入根节点到索引表
	 * @param parentID     父虚拟节点ID
	 * @param nodeName      节点名称
	 * @param nodeCode      节点代码ID
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insertRoot(String parentID,
			String nodeName,String nodeCode) throws ErrorMessage;
	
	/**
	 *  获取插入根节点到索引表,默认父虚拟根节点为-1的SQL
	 * @param nodeName      节点名称
	 * @param nodeCode      节点代码ID
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertRootSql(String nodeName,
			String nodeCode) throws ErrorMessage;
	
	/**
	 *  获取插入根节点到索引表的SQL
	 * @param parentID     父虚拟节点ID
	 * @param nodeName      节点名称
	 * @param nodeCode      节点代码ID
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertRootSql(String parentID,
			String nodeName,String nodeCode) throws ErrorMessage;
	
	/**
	 *  传入节点ID,插入根节点到索引表,节点名称和代码可以为空
	 * @param nodeId      节点ID
	 * @param parentID     父虚拟节点ID
	 * @param nodeName      节点名称
	 * @param nodeCode      节点代码ID
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insertRootByNodeId(String nodeId,
			String parentID,String nodeName,String nodeCode) throws ErrorMessage;
	
	/**
	 *  传入节点ID,插入根节点到索引表,节点名称和代码可以为空
	 * @param nodeId      节点ID
	 * @param parentID    父虚拟节点ID
	 * @param nodeName    节点名称
	 * @param nodeCode    节点代码ID
	 * @param nodeDesc    节点描述
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract String insertRootByNodeId(String nodeId,
			String parentID,String nodeName,String nodeCode,
			String nodeDesc) throws ErrorMessage;
	
	/**
	 *  传入根节点ID,获取插入根节点到索引表的SQL,节点名和代码可以为空
	 * @param nodeId      节点ID
	 * @param parentID     父虚拟节点ID
	 * @param nodeName      节点名称
	 * @param nodeCode      节点代码ID
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertRootByNodeIdSql(String nodeId,
			String parentID,String nodeName,String nodeCode) throws ErrorMessage;
	
	/**
	 *  传入根节点ID,获取插入根节点到索引表的SQL,节点名和代码可以为空
	 * @param nodeId      节点ID
	 * @param parentID     父虚拟节点ID
	 * @param nodeName      节点名称
	 * @param nodeCode      节点代码ID
	 * @param nodeDesc     节点描述
	 * @return 插入记录ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertRootByNodeIdSql(String nodeId,
			String parentID,String nodeName,String nodeCode,
			String nodeDesc) throws ErrorMessage;
	
	/**
	 *  插入虚拟根节点
	 * @param nodeId      节点ID
	 * @return 插入记录ID和执行结果
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult insertVirtualRoot(String nodeId) throws ErrorMessage;
	
	/**
	 *  插入虚拟根节点
	 * @param nodeId      节点ID
	 * @param nodeCode    节点真实ID
	 * @return 插入记录ID和执行结果
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult insertVirtualRoot(String nodeId, String nodeCode) throws ErrorMessage;
	
	/**
	 *  插入虚拟根节点
	 * @param nodeId      节点ID
	 * @param nodeCode    节点真实ID
	 * @param nodeName    节点名称
	 * @param nodeDesc    节点描述
	 * @return 插入记录ID和执行结果
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult insertVirtualRoot(String nodeId, String nodeCode,
			String nodeName, String nodeDesc) throws ErrorMessage;
	
	/**
	 *  获取插入虚拟根节点的SQL
	 * @param nodeId      节点ID
	 * @return 插入记录ID和执行结果
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertVirtualRootSql(String nodeId) throws ErrorMessage;
	
	/**
	 *  获取插入虚拟根节点的SQL
	 * @param nodeId      节点ID
	 * @param nodeCode    节点真实ID
	 * @return 插入记录ID和执行结果
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertVirtualRootSql(String nodeId, String nodeCode) throws ErrorMessage;
	
	
	/**
	 *  获取插入虚拟根节点的SQL
	 * @param nodeId      节点ID
	 * @param nodeCode    节点真实ID
	 * @return 插入记录ID和执行结果
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getInsertVirtualRootSql(String nodeId, String nodeCode,
			String nodeName, String nodeDesc) throws ErrorMessage;
	
	/**
	 *  删除索引记录
	 * @param nodeId 索引ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult delete(String nodeId)throws ErrorMessage;
	
	/**
	 *  获取删除索引记录的SQL语句
	 * @param nodeId 索引ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getDeleteSql(String nodeId)throws ErrorMessage; 
	
	/**
	 *  删除虚根节点记录
	 * @param nodeId 虚根节点ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult deleteVirtualNode(String nodeId)throws ErrorMessage;
	
	/**
	 *  获取删除虚根节点的SQL语句
	 * @param nodeId 虚根节ID
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult getDeleteVirtualNodeSql(String nodeId)throws ErrorMessage; 
	
	/**
	 *  索引表移动
	 * @param srcId    被移动节点ID
	 * @param trgId    移动目标节点ID
	 * @param moveType 移动类型
	 * @throws ErrorMessage 
	 */
	public abstract void move(String srcId, String trgId, Index_Node_Move_Type moveType) throws ErrorMessage;
	
	 /**  查找两个节点之间的路径
	 * @param startNode 起始节点
	 * @param endNode   终止节点
	 * @return  终止节点为空时返回起始节点到根节点的路径<BR>
	 * 		   当起始节点或者终止节点不存在时:返回NULL<BR>
	 *         起始节点和终止节点间不存在路径时:返回null<BR>
	 *         终止节点开始到起始节点间起始节点的所有父亲(包含终止节点)<BR>
	 */
	public abstract ArrayList<String> findPath(String startNode, String endNode) throws ErrorMessage;
	
	/**
	 * @return 节点ID
	 * @throws ErrorMessage 
	 */
	public abstract String getNodeId() throws ErrorMessage;
	
	/**
	 * @return 节点父亲ID
	 * @throws ErrorMessage 
	 */
	public abstract String getNodeParentId() throws ErrorMessage;
	
	/**
	 * @return 节点名称
	 * @throws ErrorMessage 
	 */
	public abstract String getNodeName() throws ErrorMessage;
	
	/**
	 * @return 节点描述
	 * @throws ErrorMessage 
	 */
	public abstract String getNodeDesc() throws ErrorMessage;
	
	/**
	 * @return 节点对应真实表记录ID
	 * @throws ErrorMessage 
	 */
	public abstract String getNodeCode() throws ErrorMessage;
	
	/**
	 * @return 节点类型
	 * @throws ErrorMessage 
	 */
	public abstract String getNodeType() throws ErrorMessage;

	/**
	 * @return boolean 是否叶子节点
	 * @throws ErrorMessage 
	 */
	public abstract boolean getIsLeaf() throws ErrorMessage;
	
	/**
	 * @return 节点操作类型
	 * @throws ErrorMessage 
	 */
	public abstract String getOperatorType() throws ErrorMessage;

	/**
	 * @return 节点顺序号
	 * @throws ErrorMessage 
	 */
	public abstract String getNodeSequence() throws ErrorMessage;

	/**
	 * @return 索引节点是否存在
	 * @throws ErrorMessage
	 */
	public abstract boolean isExist() throws ErrorMessage;
	
	/**
	 * 创建索引表访问对象
	 * @param userId        用户信息
	 * @param indexTabName 	索引表名(系统模型索引表名称@see MdParam.Table_Name)
	 * @return 实例
	 * @throws ErrorMessage
	 */
	public static IndexTable getNewInstance(String userId, String indexTabName) throws ErrorMessage{
		return (IndexTable)get(IndexTable.class.getSimpleName(), userId, indexTabName);
	}
	
	/**
	 * 创建索引表访问对象
	 * @param userId        用户信息
	 * @param indexTabName  索引表名(系统模型索引表名称@see MdParam.Table_Name)
	 * @param indexId       索引节点ID
	 * @return 实例
	 * @throws ErrorMessage
	 */
	public static IndexTable getNewInstance(String userId, String indexTabName, String indexId) throws ErrorMessage{
		return (IndexTable)get(IndexTable.class.getSimpleName(), userId, indexTabName, indexId);
	}
}
